/**----------------------------------------
 * @description 消息处理基类
 * @author      lxc
 * @file        MsgProcess.ts
 * @Date        2022-05-05
 * @version     1.0.0
 * ----------------------------------------
 */

import { LogClass } from "../LogClass";
import { ListenerData, MsgType } from "./MsgMgr";

/**
 * 消息处理接口
 */
export interface IMsgProcess {
    /**
     * 初始化消息监听列表
     */
    initListeners(): void
    /**
     * 移除所有消息监听
     */
    removeListeners(): void
    /**
     * 添加 ui 类型的消息监听，有一个单添加，必须配一个单移除，要成对出现 
     */
    addUIListener(msgName: string | number, callBack: Function, priority?: number, swallow?: boolean):void
}
/**
 * 消息处理基类
 */
export class MsgProcess implements IMsgProcess {
    /**
     * 日志输出对象
     */
    protected logObj : LogClass = null;
    /**
     * 当前消息处理器的消息监听容器
     * 用于记录当前处理器监听了哪些消息
     */
    protected listenerArray : Array<ListenerData> = [];

    constructor(){
        this.logObj = new LogClass()
        this.initListeners()
    }
    /**
     * 初始化消息监听列表
     */
    initListeners(): void {
        this.removeListeners()
    }
    /**
     * 移除所有消息监听
     */
    removeListeners(): void {
         this.listenerArray.forEach((listener)=>{
            if (listener.msgType == MsgType.UI){
                /** 从全局 ui 消息容器中移除消息监听 */
                gVar.UIMsgMgr.removeListener(listener);
            }
         })
    }
    /**
     * 添加UI的消息监听至UI消息管理容器
     * @param msgName 消息名
     * @param callBack 消息处理回调
     * @param priority 优先级
     * @param swallow 吞噬消息
     * @returns 消息被监听的数据结构
     */
    addUIListener(msgName: string | number, callBack: Function, priority?: number, swallow?: boolean): void {
        let listener = gVar.UIMsgMgr.addListener(msgName,callBack,priority,swallow);
        this.listenerArray.push(listener);
    }

    setPrefix(prefix : string){
        this.logObj.setPrefix(prefix)
    }

    printLog(str: string, ...args: any) {
        this.logObj.printLog(str, ...args)
    }

    printError(str: string, ...args: any) {
        this.logObj.printError(str, ...args)
    }

    printWarn(str: string, ...args: any){
        this.logObj.printWarn(str, ...args)
    }

    awaysPrint(str: string, ...args: any){
        this.logObj.awaysPrint(str, ...args)
    }
}
